package com.bfxy.disruptor.common.balance;

import com.bfxy.disruptor.common.exception.AlertException;
import com.bfxy.disruptor.common.exception.TimeoutException;
//什么时候生产者可以生产数据，什么时候消费者可以消费数据，就是通过Sequence和SequenceBarrier平衡的，
/*
 生产端是有一个Sequence的，这个序号总是递增的，3个消费者调用get方法从RingBuffer里面获取数据，
 每一个消费者都是对应一个SequenceBarrier（序号栅栏），是通过SequenceBarrier做平衡的，什么时候生产者可以生产数据，
 什么时候消费者可以消费数据，就是通过Sequence和SequenceBarrier平衡的，
 */
/*
 每一个消费者都会有一个Sequence，所有的生产者公用一个Sequence，
 将生产者共用的Sequence和每个消费者的Sequence做对比，消费者调用waitfor进行等待，
 */
//消费者与RingBuffer之间的桥梁。消费者并不直接访问RingBuffer，从而能减少RingBuffer上的并发冲突；
//生产者对RingBuffer的互斥访问，生产者与消费者之间的协调以及消费者之间的协调，都是通过Sequence实现。
public interface SequenceBarrier
{
    long waitFor(long sequence) throws AlertException, InterruptedException, TimeoutException;

    long getCursor();

    boolean isAlerted();

    void alert();

    void clearAlert();

    void checkAlert() throws AlertException;
}
